import '../../networking.dart';

enum NWInjectTense {
  request, // 发起请求前（未实现）
  // metadata, // 收到元数据后（未实现）
  response, // 收到响应后（未实现）
  error, // 请求报错后
  // uploading, // 上传时（未实现）
  // downloading, // 下载时（未实现）
}

typedef InjectExecute = Future<Result> Function(Object? object);

class NWInject {
  bool replay = false;
  NWInjectTense tense;
  late final InjectExecute execute;
  NWInject({required this.tense});

  // 是否达成注入执行的条件
  bool requirement() {
    return true;
  }
}

///
/// 在Request发起前执行注入
/// 先执行注入，执行成功后再执行当前请求
/// 注入执行失败会返回注入的错误，并且不执行当前请求
///
/// 如果需要执行当前请求，将replay写为true
///
class NWInjectReqeust extends NWInject {
  NWInjectReqeust({
    super.tense = NWInjectTense.request,
  });

  @override
  bool get replay => false;
}

class TTT {
  test() {
    final requestInject = NWInjectReqeust(
    );
    requestInject.replay = true;
  }

  Future<Result> execute(Object? object) async {
    return Result.successful("");
  }
}

///
/// 在收到Response后执行注入
/// 当前请求完毕后，会执行的注入，
/// 注入执行成功，会返回当前请求的response，
/// 注入执行失败，会抛出错误
///
/// 如果需要忽略注入执行失败，将replay改为true
/// 如果不忽略注入的执行失败，会以Failure返回，附带response信息和注入失败的信息
///
class NWInjectResponse extends NWInject {
  NWInjectResponse({
    super.tense = NWInjectTense.response,
  });

  @override
  bool get replay => false;
}

///
/// 在当前请求失败后执行注入
/// 当前请求error，会执行注入，注入执行成功后，会重新执行当前请求，
/// 当前请求再次失败，就会抛出错误，不会再次执行注入（注入是一次性的）
///
/// 返回的错误信息有请求的错误信息和注入的错误信息
///
/// 如果不需要重新请求，将replay改为false，此时将返回错误信息，请求的错误信息和注入的错误信息都会返回
///

class NWInjectError extends NWInject {
  NWInjectError({
    super.tense = NWInjectTense.error,
  });

  @override
  bool get replay => true;
}
